// 组合式继承
// 组合式继承 = 借用构造函数继承 + 原型链继承
function Vechile(brandName, price) {
  this.brandName = brandName
  this.price = price
}
Vechile.prototype.sale = function() { console.log("售卖机车, ", this.brandName) }

function Bus(brandName, price, seatNo) {
  Vechile.call(this, brandName, price)  // 借用构造函数继承
  this.seatNo = seatNo
}
// 原型链继承，子类Bus的原型作为父类Vechile的实例，获得属性__proto__，指向父类的原型，获取父类原型上，属性与方法的引用。
Bus.prototype = new Vechile()
Bus.prototype.constructor = Bus

const bus = new Bus('大巴', 3000, 20)
bus.sale()

// 寄生式组合继承
// 寄生式组合继承 = 借用构造函数继承 + 中间件函数（如 Object.create）的原型链继承
// 组合式继承的缺点，Vechile构造函数执行了2次，如果构造函数中有耗时的逻辑，则会大大降低浏览器性能

function Car(brandName, price, typeNo) {
  Vechile.call(this, brandName, price)
  this.typeNo = typeNo
}
// 使用 Object.create 创建一个新对象，新对象的原型__proto__，指向 parent
Car.prototype = Object.create(Vechile.prototype)
Car.prototype.constructor = Car

const car = new Car('的士', 1000, 10086)
car.sale()
console.log("car", car)